package cn.hacynn.nd.service;

import cn.hacynn.nd.pojo.dto.CreateDirDTO;
import cn.hacynn.nd.pojo.dto.FileRenameDTO;
import cn.hacynn.nd.pojo.dto.FileUrlDTO;
import cn.hacynn.nd.pojo.dto.SaveFileDTO;
import cn.hacynn.nd.pojo.entity.File;
import cn.hacynn.nd.pojo.vo.DownloadListVO;
import cn.hacynn.nd.pojo.vo.FileDetailVO;
import cn.hacynn.nd.pojo.vo.FileSpaceVO;

import java.util.List;

/**
 * @Author Hacynn
 * @Date 2024/5/25 17:47
 * @Version 1.0
 */
public interface FileService {

    /**
     * 获取当前用户文件列表信息
     * @return
     */
    List<File> list(String prefix);

    /**
     * 获取用户空间容量
     * @return
     */
    FileSpaceVO getFileSpace();

    /**
     * 新建文件夹
     * @param createDirDTO
     */
    void createDir(CreateDirDTO createDirDTO);

    /**
     * 保存文件信息
     * @param saveFileDTO
     */
    void saveFile(SaveFileDTO saveFileDTO);

    /**
     * 将文件移入回收站
     * @param ossPath
     */
    void updateDeletedByOssPath(String ossPath, Boolean b);

    /**
     * 获取回收站中的文件列表信息
     * @return
     */
    List<File> trashBinList();

    /**
     * 根据是否是文件夹进行排序，文件夹排在前面
     * @param list
     */
    void sortByDir(List<File> list);

    /**
     * 根据oss路径查询文件
     * @param userId
     * @param ossPath
     * @return
     */
    File getFileByPath(Long userId, String ossPath);

    /**
     * 将回收站中的文件（或文件夹）彻底删除
     * @param filePath
     */
    void delete(String filePath);

    /**
     * 清空回收站中的所有文件
     */
    void clearAllFiles();

    /**
     * 文件重命名
     * @param fileRenameDTO
     */
    void rename(FileRenameDTO fileRenameDTO);

    /**
     * 查看文件详情
     * @param ossPath
     * @return
     */
    FileDetailVO detail(String ossPath);

    /**
     * 获取预览地址
     * @param fileUrlDTO
     * @return
     */
    String previewUrl(FileUrlDTO fileUrlDTO);

    /**
     * 文件下载
     * @param ossPath
     * @return
     */
    String download(String ossPath);

    /**
     * 获取分享地址
     * @param fileUrlDTO
     * @return
     */
    String shareUrl(FileUrlDTO fileUrlDTO);

    /**
     * 文件夹下载（打包下载文件）
     * @param dirPath
     * @return
     */
    List<DownloadListVO> downloadDir(String dirPath);

    /**
     * 使用【BFS算法】查找文件夹下所有文件（包括文件夹）的信息
     * @param userId
     * @param dir
     * @return
     */
    List<File> getFilesByDir(Long userId ,File dir);
}
